
//删除有序链表中重复的元素-II

class ListNode {
    int val;
    ListNode next = null;
    public ListNode(int val) {
        this.val = val;
    }
}


public class Solution {
    /**
     * 删除链表中所有重复出现的节点
     *
     * @param head ListNode类 链表的头节点
     * @return ListNode类 处理后的链表
     */
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        // 哨兵节点，用于处理头部可能被删除的情况
        ListNode dummy = new ListNode(-1);
        dummy.next = head;

        ListNode prev = dummy; // 前驱指针
        ListNode cur = head;  // 当前指针

        while (cur != null) {
            // 检查当前节点是否重复
            boolean isDuplicate = false;
            while (cur.next != null && cur.val == cur.next.val) {
                cur = cur.next;
                isDuplicate = true;
            }

            if (isDuplicate) {
                // 跳过所有重复节点
                prev.next = cur.next;
            } else {
                // 当前节点非重复，前驱指针前移
                prev = cur;
            }

            cur = cur.next; // 当前指针继续前进
        }

        return dummy.next;
    }
}
